昨天帶大家認識了Math.clz32()
,最後還實作了fastLog2()
,不知道各位是不是對log
充滿著許多疑惑的XDD
沒關係,我都知道,還不需要敲碗我就直接端上桌給大家品嚐一下log
吧!
熟悉的詠唱環節:
「寐偲,露個,炭!!!」
那我們就先來聊聊對數吧!
先來看看對數的長相:
這樣的形式我們會用「log
以a
為底b
的對數」來描述他,他的意思就是我們有兩個數a
跟b
,結果會是去計算a
的多少次方等於b
。
舉例來說,log
以2
為底8
的對數會是多少呢?因為8
會是2
的三次方,所以我們會得到結果是3
。
那為什麼要發明對數呢?
在數學上對數有很強大的意義,他可以讓數字達到簡化的效果,且取對數後能進行更簡易的計算,在數學上是一個很重要的存在。
log(a * b) = log(a) + log(b)
log(a / b) = log(a) - log(b)
log(a^b) = b * log(a)
懂了對數大概的意義後就回到主軸吧~
認識log
之後Math.log10()
就沒什麼問題了吧!看到函式名稱有個10
應該就不難知道這是以以10
為底的對數。
Math.log10(x)
傳入一個大於等於0
的數字。
他將會回傳以10
為底x
的對數。
但如果x
小於0
,將會回傳NaN
。
(只有虛數的次方會是負數,通常這邊我們不會去討論虛數)
那因為寐偲眾多的log
咒語規範都大同小異,我們就統一在這簡單帶過,然後稍微看看有哪些地方不一樣吧!
恩...轉成數字...判斷NaN
或正無限大...如果是1
就回傳0
...
喔!看到了如果是0
就回傳負無限大!
這是什麼意思呢???等等回來討論,先繼續把剩下看完
如果小於0
就回傳NaN
...最後回傳以10
為底的對數的近似值。
OK!沒什麼特別的了!
回到剛剛的疑惑吧!
我們要理解為什麼0
的對數結果是負無限大之前我們先來理解負數次放究竟是什麼意思吧。
根據指數的定義,我們如果一個數a^(-b)
,那得到的值就會是1 / a^b
,可以觀察到如果指數是負數,那結果就會是取正次方的倒數:2^(-2)
就會是1 / 2^2
。
0
回傳負無限大所以回到上面,如果要取0
的對數,我們就要思考10
的幾次方會是0
,如果10^(-2)
是1 / 100
,10^(-3)
是1 / 1000
,到這邊應該就可以觀察到了吧!指數越小(往負方向),最後的結果就越趨近於0
,所以我們就可以知道10
的負無限大次方會非常接近0
。
只是把10
換成2
麻!輕鬆輕鬆~
咦??等等,在數學中,我們通常會將log
以10
為底的10
省略,所以log(10)
就會是以10
為底10
的對數,但剛剛以已經有了Math.log10()
,這個Math.log()
又是什麼呢?
只是把10
換成natural
麻!輕鬆輕鬆~恩?等等
什麼是natural logarithm
???
關於這個呢...
「我們以後將會專門做一期視頻為大家講解。」
這個一樣牽扯到了natural
,先同上XDD
最後就來試用看看各種log
吧!
console.log(Math.log() === Math.log10()); //false
console.log(Math.log10(10)); //1
console.log(Math.log10(1000)); //3
console.log(Math.log2(2)); //1
console.log(Math.log2(16)); //4
console.log(Math.log2(32)); //5
console.log(Math.log2(4)); //2
console.log(Math.log2(1)); //0
console.log(Math.log(Math.E)); //1 ???????
console.log(Math.log10(1)); //0
console.log(Math.log2(1)); //0
console.log(Math.log(1)); //0
console.log(Math.log10(0)); //-Infinity
console.log(Math.log2(0)); //-Infinity
console.log(Math.log(0)); //-Infinity
console.log(Math.log1p(0)); //-Infinity
參考資料:
維基百科-對數
中央大學數學系專題-指數與指數函數
ECMAScript-Math.log10()
ECMAScript-Math.log2()
ECMAScript-Math.log
ECMAScript-Math.log1p